00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef DESCENE_PRIV_HPP
00033 #define DESCENE_PRIV_HPP
00034
00035 #include "deScene.hpp"
00036 #include "deOctree.hpp"
00037 #include "deFileSystem.hpp"
00038 #include "deBST.hpp"
00039 #include "dePolyABT.hpp"
00040 #include "deWorld_Helper.hpp"
00041 #include "deObjectTree.hpp"
00042
00043 #pragma warning (disable : 4512) // assignment operator could not be generated
00044
00045 deBoolean IdeSceneRoom_Initialize();
00046 deBoolean IdeSceneObject_Initialize();
00047
00048 void IdeSceneRoom_ShutDown();
00049 void IdeSceneObject_ShutDown();
00050
00051 extern IdeVertexBuffer * s_AABB_VB;
00052 extern IdeVertexBuffer * s_OBB_VB;
00053
00054
00055 class deSceneGraph : public IdeSceneGraph
00056 {
00057 public:
00058 deSceneGraph();
00059 ~deSceneGraph();
00060
00061 long Traverse(deSceneTraversal* Params);
00062 deBoolean SetCullFlags(long CullFlags);
00063 long GetCullFlags();
00064
00065 deBoolean SetDebugFlags(long DebugFlags);
00066 long GetDebugFlags();
00067
00068 IdeSceneRoom * FindRoomWithID(deWorldID WorldID, deObjectID ObjectID);
00069 deBoolean AddRoom(IdeSceneRoom * Room);
00070 deBoolean RemoveRoom(IdeSceneRoom* Room);
00071 deBoolean AddSceneObject(IdeSceneObject* Object);
00072 void RemoveSceneObject(IdeSceneObject* Object);
00073 void RepositionSceneObject(IdeSceneObject* Object);
00074
00075 void AddObjectList(deTList <IdeSceneObject*> &list);
00076 deBoolean PointsOccluded(deVec3d points[], long num);
00077 deBoolean PortalOccluded(IdePortal * portal);
00078
00079 DWORD TestIntersection(const deVec3d &Position, const deVec3d *Mins, const deVec3d *Maxs);
00080 deBoolean TestCollision(const IdeCollision::deCollideParams & Params, IdeCollision * Collision);
00081 void ObjectExtents(IdeBoundingVolume* volume, IdeCollision * Results);
00082 long LightExtents(const deVec3d& pos, const deAABB& bbox, IdeSceneLight** outBuffer, long bufferSize);
00083
00084 private:
00085 void BuildSphereCullList(deTList <IdeSceneObject*> &list);
00086 int DetailCullObjects(deDouble MinPixels);
00087 int OcclusionSphereCullObjects();
00088 void CleanUpSphereCullList();
00089
00090 private:
00091 long m_CurrentPassNum;
00092 long m_CullFlags;
00093 long m_DebugFlags;
00094 long m_MinPixelCull;
00095 deTList <IdeSceneRoom*> m_Rooms;
00096
00097
00098 deTList <IdeSceneObject*> m_Objects;
00099 deObjectTree m_ObjectTree;
00100 deObjectTree m_LightTree;
00101 struct cull_sphere_t
00102 {
00103 public:
00104 deVec3d boundcenter, occludecenter;
00105 deDouble boundradius, occluderadius;
00106 deDouble zval;
00107 IdeSceneObject * object;
00108 void * listptr;
00109 cull_sphere_t * next;
00110 };
00111 int m_NumOccluders;
00112 cull_sphere_t *m_SphereCullFront, *m_SphereCullBack;
00113 IdeCamera * m_CurrentCamera;
00114 deVec3d m_CurrentCamFwd;
00115 };
00116
00117 class deCollision : public IdeCollision
00118 {
00119 public:
00120 deCollision();
00121 ~deCollision();
00122
00123 long Release();
00124
00125 void Reset();
00126
00127 long GetNumCollisions();
00128 void GetCollision(long ColNum, deCollideInfo & collision);
00129
00130 deBoolean AddCollision(const deCollideInfo & collision);
00131
00132 private:
00133 deTArray <deCollideInfo> m_Collisions;
00134 };
00135
00136
00137
00138 class deSceneRoom : public deWorldObject, virtual public IdeSceneRoom
00139 {
00140 public:
00141 deSceneRoom();
00142 virtual ~deSceneRoom();
00143
00144 WorldObjectClassDef;
00145 void* GetWOInterface(long interface_id);
00146 deBoolean DeSerializeLoad();
00147
00148 void SetRoomListPtr(void * ptr);
00149 void*GetRoomListPtr();
00150
00151 long Traverse(IdeSceneGraph::deSceneTraversal* Params);
00152
00153 deBoolean TestCollision(const IdeCollision::deCollideParams & Params, IdeCollision * Collision);
00154
00155 long GetPassNum();
00156 void GetAABB(deVec3d &Min, deVec3d &Max);
00157
00158 void SetContents(DWORD contents);
00159 DWORD GetContents();
00160
00161 deBoolean AddSceneObject(IdeSceneObject * obj);
00162 deBoolean AddPortal(IdePortal * portal);
00163
00164 deBoolean RemoveSceneObject(IdeSceneObject * obj);
00165
00166 protected:
00167 int ViewCullObjectList(IdeCamera * c, const IdePlaneFrustum* f, deTList <IdeSceneObject*> &inout);
00168
00169 deTList <IdePortal*> m_PortalList;
00170 deTList <IdeSceneObject*> m_Objects;
00171 deVec3d m_Min, m_Max;
00172 DWORD m_Contents;
00173 void* m_RoomListPtr;
00174
00175 private:
00176 virtual int TraverseRoom(IdeSceneGraph::deSceneTraversal* ) { return 0; }
00177 virtual deBoolean TestRoomCollision(const IdeCollision::deCollideParams & , IdeCollision * ) { return deFALSE; }
00178 int m_CurrentPassNum;
00179
00180 deTArray<deIDPair> m_CachedObjects;
00181 };
00182
00183
00184 class deSceneObject : public deWorldObject, virtual public IdeSceneObject
00185 {
00186 protected:
00187 virtual long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params) = 0;
00188
00189 public:
00190 deSceneObject(interface_t myType);
00191 virtual ~deSceneObject();
00192
00193 IdeSceneObject::interface_t GetSOIType();
00194 void* GetSOInterface(IdeSceneObject::interface_t i);
00195 void* GetWOInterface(long interface_id);
00196 deBoolean Serialize(IdeFile* FS);
00197 deBoolean DeSerialize(IdeFile* FS, long DataLength, u32 &AmtRead);
00198 deBoolean DeSerializeLoad();
00199
00200 void PreCache(IdeDriver*) {}
00201
00202 long Traverse(IdeSceneGraph::deSceneTraversal* Params);
00203 void SetActivation(activate_t a_type, deBoolean Active);
00204 deBoolean GetActivation(activate_t a_type) const;
00205
00206 void SetWorldTransform(const deTransformInfo & mat);
00207
00208 deVec3d GetBoundCenter();
00209 deVec3d GetOccludeCenter();
00210 void GetWorldTransform(deTransformInfo & mat);
00211 void GetWorldPos(deVec3d & PosVector);
00212
00213 deVec3d GetWorldBoundCenter();
00214 deVec3d GetWorldOccludeCenter();
00215 deDouble GetBoundRadius();
00216 deDouble GetOccludeRadius();
00217
00218 void GetLocalAABB(deAABB &bbox);
00219 void GetWorldOBB(deOBB &bbox);
00220 void GetWorldAABB(deAABB &bbox);
00221
00222 deBoolean IsTransparent();
00223
00224 deBoolean OccludesObject(deVec3d &position, IdeSceneObject *so, deVec3d &NormalizedDisplacement);
00225
00226 long GetCurrentPassNum() const;
00227 deBoolean AddRoomReference(IdeSceneRoom * ref, void * ptr);
00228 void* GetRoomReference(IdeSceneRoom * ref);
00229 deBoolean RemoveRoomReference(IdeSceneRoom * ref);
00230
00231 protected:
00232 void SetBoundCenter(deVec3d);
00233 void SetOccludeCenter(deVec3d);
00234 void SetBoundRadius(deDouble);
00235 void SetOccludeRadius(deDouble);
00236
00237 void SetWorldCenters();
00238
00239 void SetLocalAABB(deVec3d min, deVec3d max);
00240
00241 deVec3d CalcAverageCenter(deVec3d points[], long count);
00242 deDouble CalcBoundRadius(deVec3d points[], long count);
00243 deDouble CalcOccludeRadius(deVec3d points[], long count);
00244 void CalcLocalAABB(deVec3d points[], long count, deVec3d &min, deVec3d &max);
00245
00246 void CalcAllValues(deVec3d points[], long count);
00247
00248 void SetTransparent(deBoolean Transparent);
00249
00250 IdeLineBrush* GetBoundLine();
00251
00252 const deTransformInfo & GetWorldTransform();
00253
00254 private:
00255 protected:
00256 deTransform m_WorldTransform;
00257 deDouble m_BoundRadius;
00258 deDouble m_OccludeRadius;
00259 deVec3d m_BoundCenter;
00260 deVec3d m_OccludeCenter;
00261 deAABB m_AABB;
00262 deVec3d m_WorldBound, m_WorldOcclude;
00263 deBoolean m_Transformed;
00264 deBoolean m_Transparent;
00265 deBoolean m_Active[activate_count];
00266 long m_CurrentPassNum;
00267 const interface_t m_Interface;
00268 private:
00269 IdeLineBrush* m_BoundLine;
00270 struct RoomEntry
00271 {
00272 IdeSceneRoom* Room;
00273 void * ptr;
00274 };
00275 deTArray<RoomEntry> m_RoomList;
00276 };
00277
00278
00279 class deSceneABT : public deSceneObject, public IdeSceneABT
00280 {
00281 protected:
00282 virtual ~deSceneABT();
00283 public:
00284 deSceneABT();
00285
00286 IdeSceneObject::interface_t GetSOIType();
00287 void* GetSOInterface(IdeSceneObject::interface_t i);
00288 WorldObjectClassDef;
00289 deBoolean DeSerializeLoad();
00290
00291 deBoolean AddGeometry(IdeMesh* pMesh, const deTransformInfo & pos);
00292
00293 private:
00294 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00295 deBoolean TestRoomCollision(const IdeCollision::deCollideParams & Params, IdeCollision * Collision);
00296
00297 dePolyABT m_ABT;
00298 deBoolean m_Compiled;
00299 };
00300
00301
00302 class deSceneTerrain : public deSceneObject, public IdeSceneTerrain
00303 {
00304 protected:
00305 virtual ~deSceneTerrain();
00306 public:
00307 deSceneTerrain();
00308
00309 IdeSceneObject::interface_t GetSOIType();
00310 void* GetSOInterface(IdeSceneObject::interface_t i);
00311 WorldObjectClassDef;
00312 deBoolean DeSerializeLoad();
00313
00314 void PreCache(IdeDriver* pDriver);
00315
00316 deBoolean SetTerrainHeightMap(IdeBitmapProxy * bmp);
00317 deBoolean SetTerrainColorMap(IdeBitmapProxy * bmp);
00318 deBoolean SetTerrainDetailMap(IdeBitmapProxy * bmp);
00319
00320 deVec3d GetTerrainScale();
00321 void SetTerrainScale(deVec3d vScale);
00322 void SetTerrainScale(deFloat x, deFloat y, deFloat z);
00323
00324 deTexCoord GetDetailRepeat();
00325 void SetDetailRepeat(deTexCoord Repeat);
00326 void SetDetailRepeat(deFloat u, deFloat v);
00327
00328 void SetHeightAt(unsigned char ucHeight, long x, long y);
00329 unsigned char GetTrueHeightAt(long x, long y);
00330 deFloat GetScaledHeightAt(long x, long y);
00331
00332 deDouble GetLODBias();
00333 void SetLODBias(deDouble Bias);
00334
00335 deBoolean BuildRenderable();
00336
00337
00338 long GetGMMChunkSize();
00339 void SetGMMChunkSize(long ChunkSize);
00340 deBoolean BuildGeoMipMap(IdeDriver* pDriver);
00341
00342 private:
00343 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00344 deBoolean TestRoomCollision(const IdeCollision::deCollideParams & Params, IdeCollision * Collision);
00345
00346 struct deTerrainGMMChunk
00347 {
00348 deAABB BBox;
00349 deVec3d ChunkCenterPos;
00350 deDouble Diagonal;
00351 deDouble UnitError[8];
00352 IdeVertexBuffer* Vertices;
00353 long XCoord;
00354 long ZCoord;
00355 char CurrentLOD;
00356 };
00357 struct deTerrainGMMQuadrant
00358 {
00359 deBoundSphere BSphere;
00360 deAABB BBox;
00361 deTerrainGMMQuadrant* Children[4];
00362 deTerrainGMMChunk* Geometry;
00363 };
00364
00365
00366 deVec3d m_Scale;
00367 deTexCoord m_DetailRepeat;
00368
00369 IdeBitmapProxy* m_HeightMap;
00370 IdeBitmapProxy* m_ColorMap;
00371 IdeBitmapProxy* m_DetailMap;
00372
00373 IdeRenderTexture* m_RenderTexture;
00374
00375 deTArray<IdeVertexBuffer*> m_VBuffers;
00376 deTArray<IdeVertexBuffer*> m_IndexBuffers;
00377
00378
00379 deTerrainGMMChunk* m_GMMChunks;
00380 deTerrainGMMQuadrant* m_GMMRoot;
00381 long m_GMMChunkSize;
00382 long m_GMMChunksXSide;
00383 long m_GMMChunksZSide;
00384 deDouble m_LODBias;
00385
00386
00387 deBoolean CreateTerrainTexture(IdeDriver * pDriver);
00388
00389
00390 int GetGMMChunkNumber(long x, long z);
00391 void ResetGMMChunks();
00392 deBoolean BuildGMMQuadtree();
00393 deBoolean BuildGMMQuadrant(deTerrainGMMQuadrant* Parent, long StartX, long StartZ, long StopX, long StopZ);
00394 void DestroyGMMQuadrant(deTerrainGMMQuadrant* &Quadrant);
00395
00396
00397 deBoolean RenderGMMChunk(const deTerrainGMMChunk* Chunk, IdeSceneGraph::deSceneTraversal* Params, const deTransform& WorldTransform);
00398 deBoolean BuildGMMChunk(long x, long z, IdeDriver* pDriver);
00399 void DestroyGMMChunk(deTerrainGMMChunk* Chunk);
00400
00401
00402 deBoolean RenderVisibleGMMChunks(deTerrainGMMQuadrant* Quadrant, IdeSceneGraph::deSceneTraversal* Params, const deTransform& WorldTransform, deBoolean AllVisible);
00403 };
00404
00405
00406 class deSceneSky : public deSceneObject, public IdeSceneSky
00407 {
00408 protected:
00409 virtual ~deSceneSky();
00410 public:
00411 deSceneSky();
00412
00413 IdeSceneObject::interface_t GetSOIType();
00414 void* GetSOInterface(IdeSceneObject::interface_t i);
00415 WorldObjectClassDef;
00416 deBoolean DeSerializeLoad();
00417 void OnWorldIDSet();
00418
00419 deBoolean IsLockedToCam() const;
00420 void LockToCam(deBoolean Lock);
00421 deBoolean GetInfo(SkyInfo * info) const;
00422 deBoolean SetInfo(const SkyInfo * info);
00423
00424 private:
00425 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00426 deBoolean TestRoomCollision(const IdeCollision::deCollideParams & Params, IdeCollision * Collision);
00427
00428 deBoolean CreateVBuffers();
00429 deBoolean CreateTextures();
00430
00431 static long s_NumSkyRooms;
00432 static IdeVertexBuffer* s_VBuffer;
00433 static IdeVertexBuffer* s_SubVBs[6];
00434 IdeRenderTexture* m_Textures[6];
00435 IdeSceneSky::SkyInfo m_Info;
00436 deBoolean m_LockedToCam;
00437 };
00438
00439
00440 class deSceneAnimatedMesh : public deSceneObject, public IdeSceneAnimatedMesh
00441 {
00442 public:
00443 deSceneAnimatedMesh();
00444 virtual ~deSceneAnimatedMesh();
00445
00446 IdeSceneObject::interface_t GetSOIType();
00447 void* GetSOInterface(IdeSceneObject::interface_t i);
00448 WorldObjectClassDef;
00449
00450 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00451 void SetMesh(IdeAnimatedMesh * mesh);
00452
00453 private:
00454 IdeAnimatedMesh * pMyMesh;
00455 };
00456
00457
00458 class deSceneStaticMesh : public deSceneObject, public IdeSceneStaticMesh
00459 {
00460 public:
00461 deSceneStaticMesh();
00462 virtual ~deSceneStaticMesh();
00463
00464 IdeSceneObject::interface_t GetSOIType();
00465 void* GetSOInterface(IdeSceneObject::interface_t i);
00466 WorldObjectClassDef;
00467 deBoolean DeSerializeLoad();
00468
00469 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00470 void SetMesh(IdeMesh* mesh);
00471 void SetTransparent(deBoolean Trans);
00472
00473 private:
00474 IdeMesh * mMesh;
00475 deIDPair mMeshID;
00476 };
00477
00478
00479 class deSceneActor : public deSceneObject, public IdeSceneActor
00480 {
00481 public:
00482 deSceneActor();
00483 virtual ~deSceneActor();
00484
00485 IdeSceneObject::interface_t GetSOIType();
00486 void* GetSOInterface(IdeSceneObject::interface_t i);
00487 WorldObjectClassDef;
00488
00489 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00490 void SetActor(IdeActor* actor);
00491
00492 private:
00493 IdeActor * mActor;
00494 };
00495
00496
00497 class deSceneLight : public deSceneObject, public IdeSceneLight
00498 {
00499 public:
00500 deSceneLight();
00501 virtual ~deSceneLight();
00502
00503 IdeSceneObject::interface_t GetSOIType();
00504 void* GetSOInterface(IdeSceneObject::interface_t i);
00505 WorldObjectClassDef;
00506
00507 void SetWorldTransform(const deTransformInfo& mat);
00508
00509 long TraverseForRender(IdeSceneGraph::deSceneTraversal* Params);
00510 void SetLightData(const IdeRenderLight::LightData& lightdata);
00511 const IdeRenderLight::LightData* GetLightData();
00512 const IdeRenderLight* GetRenderLight();
00513
00514 private:
00515 IdeRenderLight* m_RenderLight;
00516 };
00517
00518 #endif